﻿using Nx.UI;
using System;

namespace Nx.ViewModels
{
    public abstract class ViewModelBase : PropertyChangedBase, IDisposable//, INotifyDataErrorInfo
    {
        public object View
        {
            get;
            set;
        }

        private object _NavigationParameter;
        public object NavigationParameter
        {
            get
            {
                return _NavigationParameter;
            }

            set
            {
                _NavigationParameter = value;
                OnNavigationParameterSet();
            }
        }

        protected virtual void OnNavigationParameterSet()
        {
        }

        protected ViewModelBase()
        {
            //_currentErrors = new Dictionary<string, List<string>>();
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                //_currentErrors.Clear();
            }
        }

        #region Validation

        //public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
        //private readonly Dictionary<string, List<string>> _currentErrors;

        //public IEnumerable GetErrors(string propertyName)
        //{
        //    if (string.IsNullOrEmpty(propertyName))
        //    {
        //        if (_currentErrors.Values.SelectMany(el => el).Any(e => !string.IsNullOrEmpty(e)))
        //        {
        //            return _currentErrors.Values;
        //        }
        //        else
        //        {
        //            return null;
        //        }
        //    }

        //    MakeOrCreatePropertyErrorList(propertyName);
        //    if (_currentErrors[propertyName].Any(e => !string.IsNullOrEmpty(e)))
        //    {
        //        return _currentErrors[propertyName].Where(e => !string.IsNullOrEmpty(e));
        //    }
        //    else
        //    {
        //        return null;
        //    }
        //}

        //public bool HasErrors
        //{
        //    get
        //    {
        //        return (_currentErrors.Where(c => c.Value.Count > 0).Count() > 0);
        //    }
        //}

        //protected void OnErrorsChanged(string property)
        //{
        //    if (ErrorsChanged != null)
        //    {
        //        ErrorsChanged(this, new DataErrorsChangedEventArgs(property));
        //    }
        //}

        //public void ClearErrorFromProperty(string property)
        //{
        //    MakeOrCreatePropertyErrorList(property);
        //    _currentErrors[property].Clear();
        //    OnErrorsChanged(property);
        //}

        //public void AddErrorForProperty(string property, string error)
        //{
        //    MakeOrCreatePropertyErrorList(property);
        //    _currentErrors[property].Add(error);
        //    OnErrorsChanged(property);
        //}

        //protected void MakeOrCreatePropertyErrorList(string propertyName)
        //{
        //    if (!_currentErrors.ContainsKey(propertyName))
        //    {
        //        _currentErrors[propertyName] = new List<string>();
        //    }
        //}

        #endregion
    }
}
